guint realized : 1;
guint use_texture_rectangle : 1;
- guint has_gl_framebuffer_blit : 1;
- guint has_frame_terminator : 1;
guint has_khr_debug : 1;
guint use_khr_debug : 1;
guint has_unpack_subimage : 1;
return priv->use_texture_rectangle;
}
-gboolean
-gdk_gl_context_has_framebuffer_blit (GdkGLContext *context)
-{
- GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
-
- return priv->has_gl_framebuffer_blit;
-}
-
-gboolean
-gdk_gl_context_has_frame_terminator (GdkGLContext *context)
-{
- GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
-
- return priv->has_frame_terminator;
-}
-
void
gdk_gl_context_push_debug_group (GdkGLContext *context,
const char *message)
has_npot = priv->gl_version >= 20;
has_texture_rectangle = FALSE;
- /* This should check for GL_NV_framebuffer_blit as well - see extension at:
- *
- * https://www.khronos.org/registry/gles/extensions/NV/NV_framebuffer_blit.txt
- *
- * for ANGLE, we can enable bit blitting if we have the
- * GL_ANGLE_framebuffer_blit extension
- */
- priv->has_gl_framebuffer_blit = epoxy_has_gl_extension ("GL_ANGLE_framebuffer_blit");
-
- /* No OES version */
- priv->has_frame_terminator = FALSE;
-
priv->has_unpack_subimage = epoxy_has_gl_extension ("GL_EXT_unpack_subimage");
priv->has_khr_debug = epoxy_has_gl_extension ("GL_KHR_debug");
}
has_npot = priv->gl_version >= 20 || epoxy_has_gl_extension ("GL_ARB_texture_non_power_of_two");
has_texture_rectangle = priv->gl_version >= 31 || epoxy_has_gl_extension ("GL_ARB_texture_rectangle");
- priv->has_gl_framebuffer_blit = priv->gl_version >= 30 || epoxy_has_gl_extension ("GL_EXT_framebuffer_blit");
- priv->has_frame_terminator = epoxy_has_gl_extension ("GL_GREMEDY_frame_terminator");
priv->has_unpack_subimage = TRUE;
priv->has_khr_debug = epoxy_has_gl_extension ("GL_KHR_debug");
"* Extensions checked:\n"
" - GL_ARB_texture_non_power_of_two: %s\n"
" - GL_ARB_texture_rectangle: %s\n"
- " - GL_EXT_framebuffer_blit: %s\n"
- " - GL_GREMEDY_frame_terminator: %s\n"
" - GL_KHR_debug: %s\n"
"* Using texture rectangle: %s",
priv->use_es ? "OpenGL ES" : "OpenGL",
glGetString (GL_SHADING_LANGUAGE_VERSION),
has_npot ? "yes" : "no",
has_texture_rectangle ? "yes" : "no",
- priv->has_gl_framebuffer_blit ? "yes" : "no",
- priv->has_frame_terminator ? "yes" : "no",
priv->has_khr_debug ? "yes" : "no",
priv->use_texture_rectangle ? "yes" : "no"));
G_OBJECT_CLASS (gdk_win32_gl_context_parent_class)->dispose (gobject);
}
-static void
-gdk_gl_blit_region (GdkSurface *surface, cairo_region_t *region)
-{
- int n_rects, i;
- int scale = gdk_surface_get_scale_factor (surface);
- int wh = gdk_surface_get_height (surface);
- cairo_rectangle_int_t rect;
-
- n_rects = cairo_region_num_rectangles (region);
- for (i = 0; i < n_rects; i++)
- {
- cairo_region_get_rectangle (region, i, &rect);
- glScissor (rect.x * scale, (wh - rect.y - rect.height) * scale, rect.width * scale, rect.height * scale);
- glBlitFramebuffer (rect.x * scale, (wh - rect.y - rect.height) * scale, (rect.x + rect.width) * scale, (wh - rect.y) * scale,
- rect.x * scale, (wh - rect.y - rect.height) * scale, (rect.x + rect.width) * scale, (wh - rect.y) * scale,
- GL_COLOR_BUFFER_BIT, GL_NEAREST);
- }
-}
-
#ifdef GDK_WIN32_ENABLE_EGL
static gboolean
_get_is_egl_force_redraw (GdkSurface *surface)
}
}
- if (cairo_region_contains_rectangle (painted, &whole_window) == CAIRO_REGION_OVERLAP_IN)
- SwapBuffers (context_win32->gl_hdc);
- else if (gdk_gl_context_has_framebuffer_blit (context))
- {
- glDrawBuffer(GL_FRONT);
- glReadBuffer(GL_BACK);
- gdk_gl_blit_region (surface, painted);
- glDrawBuffer(GL_BACK);
- glFlush();
-
- if (gdk_gl_context_has_frame_terminator (context))
- glFrameTerminatorGREMEDY ();
- }
- else
- {
- g_warning ("Need to swap whole buffer even thouigh not everything was redrawn. Expect artifacts.");
- SwapBuffers (context_win32->gl_hdc);
- }
+ SwapBuffers (context_win32->gl_hdc);
}
#ifdef GDK_WIN32_ENABLE_EGL
else
_reset_egl_force_redraw (surface);
}
- if (cairo_region_contains_rectangle (painted, &whole_window) == CAIRO_REGION_OVERLAP_IN || force_egl_redraw_all)
- eglSwapBuffers (display->egl_disp, egl_surface);
- else if (gdk_gl_context_has_framebuffer_blit (context))
- gdk_gl_blit_region (surface, painted);
- else
- {
- g_warning ("Need to swap whole buffer even thouigh not everything was redrawn. Expect artifacts.");
- eglSwapBuffers (display->egl_disp, egl_surface);
- }
+ eglSwapBuffers (display->egl_disp, egl_surface);
}
#endif
}
gdk_win32_surface_handle_queued_move_resize (draw_context);
GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_parent_class)->begin_frame (draw_context, update_area);
- if (gdk_gl_context_get_shared_context (context))
- return;
-
- if (gdk_gl_context_has_framebuffer_blit (context))
- return;
-
- /* If nothing else is known, repaint everything so that the back
- buffer is fully up-to-date for the swapbuffer */
- cairo_region_union_rectangle (update_area, &(GdkRectangle) {
- 0, 0,
- gdk_surface_get_width (surface),
- gdk_surface_get_height (surface) });
}
typedef struct